#include <bits/stdc++.h>

using namespace std;

struct edge {
  int x, y;
  int rest;  // 剩余移除障碍物的次数
  edge(int _x, int _y, int _rest) : x(_x), y(_y), rest(_rest) {}
};

const int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};

int main1() {
  int n, m;
  cin >> n >> m;
  vector<vector<int>> grid(n, vector<int>(m, 0));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> grid[i][j];
    }
  }
  int k;
  cin >> k;

  if (n == 1 && m == 1) return 0;

  k = min(k, m + n - 3);      // 最多需要移除障碍物的次数
  bool visited[n][m][k + 1];  // 次数要+1序号才为1
  memset(visited, false, sizeof(visited));  // 初始化

  queue<edge> q;
  q.push(edge(0, 0, k));

  visited[0][0][k];
  // 如果是队列不为空，则步数一直增加
  for (int step = 1; q.size() > 0; ++step) {
    int cnt = q.size();
    for (int i = 0; i < cnt; ++i) {
      edge cur = q.front();
      q.pop();
      // 四个方向遍历
      for (int j = 0; j < 4; j++) {
        int nextx = cur.x + dir[j][0];
        int nexty = cur.y + dir[j][1];
        // 越界检查
        if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue;
        // 是否是终点
        if (nextx == n - 1 && nexty == m - 1) {
          cout << step << endl;
        }
        // 障碍检查
        // 如果不是障碍，当前格子，删除次数为cur.rest是否遍历过
        if (grid[nextx][nexty] == 0 && !visited[nextx][nexty][cur.rest]) {
          q.push({nextx, nexty, cur.rest});
          visited[nextx][nexty][cur.rest] = true;  // 设置遍历
        }  // 删除次数还有，次数减1是否遍历过
        else if (grid[nextx][nexty] == 1 && cur.rest > 0 &&
                 !visited[nextx][nexty][cur.rest - 1]) {
          q.push({nextx, nexty, cur.rest - 1});  // 删除次数减1
          visited[nextx][nexty][cur.rest - 1] = true;
        }
      }
    }
  }
  cout << "-1" << endl;  // 没有路径
  return 0;
}